<script>
/* 
    js作用域
    解决性能  解决名字
    加括号将函数的声明变成函数表达式就可以完成
    ()()
    块级作用域
    eval catch() with() 有块级作用域

    es6
    let 块级作用域  根据功能


*/
// 匿名函数需要名字Uncaught SyntaxError: Function statements require a function name
// function(){
//     console.log("匿名函数");
// }()
// {};() Uncaught SyntaxError: Unexpected token ')'
// function a(){
//     console.log("匿名函数");
// }()
// console.log(({})+({}));
// 函数表达式常用
(function(a,b){
    console.log(a+b);
    return a+b;
})(1,2)
// (function(a,b){
//     console.log(a+b);
//     return a+b;
// })(1,2)

// 1.使用操作符&& || ，  表达式  webpack打包工具
let a ;
a = function(){
    console.log("你好");
}();

true&&function(){
    console.log("布尔");
}();
false||function(){
    console.log("布尔false");
}()

0,function(a,b){
    console.log(a+b+"打包工具经常使用");
}(1,2)
// 2.使用运算符  更简单的方式一个字符    一元运算符  + - ~ !  bootstrap源码使用!
!function(){
    console.log("!");
}()
+function(){
    console.log("+");
}()
-function(){
    console.log("-");
}()
~function(){
    console.log("~");
}()
// 3.不传参 是不是省略()  new 
new function(){
    console.log("直接new");
}

undefined=true;
console.log(undefined);
// 上述的性能问题   一元操作符+ - ~ 性能比较低 需要进行数字类型的转换   
// 立即执行函数 IIFE
/* 
 有什么用   
1、解决作用域下命名污染
2、性能提升，作用域查找范围小
3、有利于压缩 当做形参去替代window字符
4、避免全局命名的冲突   
5、保存闭包的状态   for循环执行异步操作 不使用立即执行函数
6、可以颠倒代码的运行顺序   UMD 通用模块规范  
注意点：
    前面加一个分号
 */
!function(){

}()
</script>